1
状態保持プロセスと末尾呼び出し最適化
AI019Lesson 7
00:00

Elixirでは、プロセスはデフォルトで一時的です。関数が終了すると、プロセスも終了します。 永続的かつ状態を持つプロセス永続的に状態を保持するプロセスを作成するには、再帰を使ってループ内でプロセスを生き続けるようにします。

1. 末尾呼び出し最適化(TCO)

関数の最終的な動作が自分自身への呼び出しである場合、Erlang VM(BEAM)は 末尾呼び出し最適化を実行します。スタックに新しいフレームを追加する代わりに、単に 新しい引数とともに関数の先頭に戻ります 関数の先頭に戻り、新しい引数を用いて処理を継続します。

def factorial(n, acc), do: _fact(n-1, acc*n) # TCO
def factorial(n), do: n * factorial(n-1) # TCOではない
greet() のロジックgreet() の呼び出しTCO:スタックフレームの再利用

2. 永続的な状態

状態は、再帰呼び出しに更新された値を引数として渡すことで維持されます。TCOにより、これらの引数はスタック上の元のパラメータを置き換え、追加のメモリ消費なしに処理を繰り返すことが可能になり、無限ループを実現できます。

main.py
TERMINALbash — 80x24
> Ready. Click "Run" to execute.
>